package main

func main() {
	/*
		1.net包概述：
			net包 抽象了 TCP 网络操作，
			使用 Listen() 得到处于 listen 状态的 TCPListener，
			使用 Accept() 得到处于 established 状态的 TCPConn，
			使用 Read()/Write() 进行读写 Socket 的操作。

			net包提供了网络编程相关的函数和类型，包括 TCP/UDP协议、Unix 域套接字、HTTP客户端和服务器等。

		（1）TCP/UDP协议：
			1、在 net 包中，TCP 和 UDP 协议都有相应的结构体表示，分别为 TCPConn 和 UDPConn。
			这些结构体实现了 net.Conn 接口，可以被用来创建和管理 TCP 和 UDP 连接。

			2、对于 TCP 连接，我们可以使用 net.Dial 或者 net.Listen 函数来创建一个连接或者监听一个端口。
			net.Dial 返回一个 TCPConn 对象，该对象代表着连接的句柄，可以用于读取和写入数据；
			net.Listen 返回一个 net.Listener 对象，该对象代表一个监听器，可以用于接收连接请求并返回一个 TCPConn 对象。

			3、对于 UDP 连接，我们可以使用 net.DialUDP 或者 net.ListenUDP 函数来创建连接或者监听端口。
			这两个函数返回的都是 UDPConn 对象，可用于读取和写入数据。

		（2）Unix 域套接字：
			1、除了 TCP 和 UDP 协议外，net包还支持 Unix 域套接字。
			Unix 域套接字只能用于本地进程之间通信，不需要进行网络通信，因此，比 TCP 和 UDP 更加高效。

			2、在 net包中，可以使用 net.DialUnix 或者 net.ListenUnix 函数来创建 Unix 域套接字的连接或监听。
			与 TCP 和 UDP 连接类似，这两个函数也会返回相应的 UnixConn 对象。

		（3）HTTP 客户端和服务端：
			1、net包中还提供了 HTTP 相关的函数和类型。
			通过使用 http包 中的 Client 和 Server 结构体，我们可以很方便地创建 HTTP 客户端和服务端。

			2、对于 HTTP 客户端，可以使用 http.Client 结构体提供的 Get、Post 等方法来发送 HTTP 请求；
			对于 HTTP 服务器，可以使用 http.Server 结构体来监听 HTTP 请求并返回响应。

			3、此外，net包还提供了其他的一些功能，比如对 IP 地址 和 端口 进行解析的函数、DNS 查询函数等。

		2.net包中的接口：
			1.Conn 接口：
				代表一条通用的网络连接，包括 TCP、UDP 或 Unix 域套接字等连接。
				通过实现 Conn接口，我们可以创建自定义的网络连接类型，并使用标准库中的一些函数和工具进行操作。

					type Conn interface {
						//从连接中读取数据并存储到指定的字节切片中
						Read(b []byte) (n int, err error)

						//向连接中写入数据
						Write(b []byte) (n int, err error)

						//关闭连接
						Close() error

						//返回本地地址
						LocalAddr() Addr

						//返回远程地址
						RemoteAddr() Addr

						//设置读写超时截止时间
						SetDeadline(t time.Time) error

						//设置读超时截止时间
						SetReadDeadline(t time.Time) error

						//设置写超时截止时间
						SetWriteDeadline(t time.Time) error
					}

			2.PacketConn 接口：
				代表一条通用的数据报连接，包括 UDP 或 Unix域套接字等连接。
				通过实现 PacketConn接口，我们可以创建自定义的数据报连接类型，并使用标准库中的一些函数和工具来进行操作。

					type PacketConn interface {
						//从连接中读取数据并存储到指定的字节切片中，并返回发送方地址
						ReadFrom(p []byte) (n int, addr Addr, err error)

						//向指定地址发送数据
						WriteTo(p []byte, addr Addr) (n int, err error)

						//关闭连接
						Close() error

						//返回本地地址
						LocalAddr() Addr

						//设置读写超时截止时间
						SetDeadline(t time.Time) error

						//设置读超时截止时间
						SetReadDeadline(t time.Time) error

						//设置写超时截止时间
						SetWriteDeadline(t time.Time) error
					}

			3.Listener 接口：
				代表一个网络监听器，用于监听来自客户端的连接请求。
				通过实现 Listener接口，我们可以创建自定义的监听器类型，并使用标准库中的一些函数和工具进行操作。

					type Listener interface {
						// 接受一个客户端连接，并返回表述连接的 Conn对象
						Accept() (Conn, error)

						// 关闭监听器
						// Any blocked Accept operations will be unblocked and return errors.
						Close() error

						// 返回监听地址
						Addr() Addr
					}

			4.Addr 接口：
				代表一个网络地址，可以表示 IP 地址和端口号等。
				通过实现 Addr接口，我们可以创建自定义的网络地址类型，并使用标准库中的一些函数和工具进行操作。

					type Addr interface {
						Network() string // 返回网络协议（如“TCP”或“UDP”）
						String() string  // 返回地址字符串 (for example, "192.0.2.1:25", "[2001:db8::1]:80")
					}

			5.Error 接口：
				代表一个网络错误，包含一个错误消息和一个布尔值，用于判断是否是临时错误，
				当发生网络错误时，会返回实现了 Error接口 的对象，程序可以通过类型断言获取具体的错误信息。

				例如，在 TCP 连接中，如果对方关闭了连接，Read操作会返回一个 error对象，表示连接已经关闭。
				这个 error对象 实现了 net.Error 接口，我们可以使用类型断言获取其具体信息，例如判断是否是临时错误、获取错误消息等。

			6.Dialer 结构体：
				Dialer 结构体定义了一些选项，用于控制网络连接的行为。
				我们可以创建一个 Dialer 对象，并设置一些选项，然后使用 Dialer.Dial方法创建网络连接。

					type Dialer struct {
						Timeout time.Duration 			//连接超时时间
						Deadline time.Time				//连接的最后期限
						LocalAddr Addr					//网络地址
						DualStack bool 					//是否支持 IPv4 和 IPv6 双栈
						FallbackDelay time.Duration		//失败后重试的时间间隔
						KeepAlive time.Duration 		//保持连接的心跳间隔
						Resolver *Resolver 				//用于解析主机名的DNS解析器
						Cancel <-chan struct{} 			//可用于取消连接的信号通道
						Control func(network, address string, c syscall.RawConn) error
					}




	*/
}
